home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tcclib.exe / JULIAN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-07  |  1.8 KB  |  65 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4. #include <mem.h>
  5.  
  6. #define MO 0
  7. #define DAY 1
  8. #define YR 2
  9.  
  10. #define BAD_DIGIT 0                     /* return error codes                */
  11. #define BAD_MONTH 1                     /* means that the dates              */
  12. #define BAD_DAY 2                       /*  January 1, 2, 3, 4 of the base   */
  13. #define BAD_YEAR 3                      /*  year become invalid dates        */
  14. #define BAD_DATE -1                     /* an error code    */
  15.  
  16. unsigned int Julian( char *date )
  17. {
  18.     static int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  19.     char c;
  20.     int n = 0;
  21.     int mdy[3];
  22.     unsigned int retjul;
  23.     int base;
  24.  
  25.     base = 1980;
  26.     days[2] = 28;
  27.     mdy[DAY] = mdy[MO] = mdy[YR] = 0;
  28.     while ( ( c = *date++ ) != 0 ) {
  29.         if (c == ' ')
  30.             continue;
  31.         if (c == '-' || c == '/') {
  32.             n++;
  33.             continue;
  34.         }
  35.         if (!isdigit(c))
  36.             return (BAD_DIGIT);
  37.         mdy[n] = 10 * mdy[n] + (c - '0');
  38.     }
  39.     if (mdy[MO] < 1 || mdy[MO] > 12)
  40.         return (BAD_MONTH);
  41.     if (mdy[YR] < 100) {
  42.         if (mdy[YR] < base - 1900)
  43.             mdy[YR] += 2000;
  44.         else
  45.             mdy[YR] += 1900;
  46.     }
  47.     if (mdy[YR] < base)
  48.         return (BAD_YEAR);
  49.     if (mdy[YR] % 4 == 0 && mdy[YR] % 100 != 0 || mdy[YR] % 400 == 0)
  50.         days[2] = 29;
  51.     if (mdy[DAY] < 1 || mdy[DAY] > days[mdy[MO]])
  52.         return (BAD_DAY);
  53.     retjul = mdy[DAY];
  54.     for (n = 1; n < mdy[MO]; n++) {
  55.         retjul += days[n];
  56.     }
  57.     for (n = base; n < mdy[YR]; n++) {
  58.         if (n % 4 == 0 && n % 100 != 0 || n % 400 == 0)
  59.             retjul += 366;
  60.         else
  61.             retjul += 365;
  62.     }
  63.     return (retjul);
  64. }
  65.